ホワイトリストにAWS IPアドレスの範囲を登録してみた
こんにちは。中村です。
はじめに
「ホワイトリストに登録するためにAWSの接続先IPアドレスを教えてください」と質問をいただくことがあります。
そんなとき、何を設定するのか考えてみます。
結論
- Elastic IPなどでIPアドレスを固定している場合は、そのIPアドレスを登録しましょう。
- 特段IPアドレスを固定していない場合は、ドメインを登録を検討しましょう。
ドメインが登録不可の場合に、IPアドレスを登録か構成の変更を検討します。
AWS IPアドレスの範囲
AWSで利用されるIPアドレスの範囲は下記ドキュメントにて公開されています。
ip-ranges.jsonの中から、接続したいサービスおよびリージョンを基に、CIDRを取得します。
前提として、ドメインを利用してAWSに接続する場合、DNSにて名前解決を行い、IPアドレスを特定し、通信が行われます。
このIPアドレスはAWSの管理下にあり、動的に変わり、固定することができません。
そのため、IPアドレスをホワイトリストに登録したい場合は、取りうるIPアドレスリストとしてCIDRを登録する必要があります。
このCIDRを利用する上で留意点があります。
1.について、更新された場合はホワイトリストも更新する必要があります。
リリースノートは下記から確認できます。
2.について、ホワイトリストにて通信制限を行うツールで大量のCIDRをさばく負荷に耐えられるか。管理可能か。
また、EC2のCIDRを登録する場合、登録されるCIDRには管理しているEC2のIPアドレスだけでなく、他のAWS上に存在するEC2のIPアドレスも含まれることになります。
この点でホワイトリストとして実現したいことができるのか?を考える必要があります。
まとめ
以上、CIDRを登録してホワイトリスト登録は技術的に可能ですが、考慮する点があります。
まずはドメイン登録を検討することをおすすめします。
閑話休題
さてここで、
公開されているCIDRを登録することで実際に通信ができるようになるのか?
気になりませんか?
私は気になりました。
ということで、試してみます。
やってみる
前提条件
- クライアント環境を準備する
- クライアント環境は、接続したいAWSサービスを利用する権限があること
利用できる環境がない場合は、下記ブログ記事を参考に環境を構築してみてください。
準備
クライアント環境に接続します。
通信制限をsquidを利用して実現します。
# yum install -y squid
# touch /etc/squid/whitelist.txt
# vi /etc/squid/squid.conf
下記設定を追加(修正)します。
acl whitelist dstdomain "/etc/squid/whitelist.txt"
http_access allow localhost whitelist
# systemctl start squid.service
# export HTTP_PROXY=http://localhost:3128
# export HTTPS_PROXY=http://localhost:3128
# export no_proxy=localhost,127.0.0.1,169.254.169.254
やってみた
接続できないことを確認
# aws s3 ls backetname
Failed to connect to proxy URL: "http://localhost:3128"
まだ何も許可設定をしていないため接続ができません。
ドメインを登録してみる
# echo "backetname.s3.ap-northeast-1.amazonaws.com" > /etc/squid/whitelist.txt
# systemctl reload squid.service
# aws s3 ls backetname
2024-08-24 00:06:32 5319 hogefile
通信できました。
CIDRを登録してみる
まずは、jsonファイルを取得します。
# echo "ip-ranges.amazonaws.com" > /etc/squid/whitelist.txt
# systemctl reload squid.service
# curl -O https://ip-ranges.amazonaws.com/ip-ranges.json
次に、東京リージョンのS3に関するCIDRをホワイトリストに登録します。
# jq -r '.prefixes[] | select(.region=="ap-northeast-1") | select(.service=="S3") | .ip_prefix' < ip-ranges.json > /etc/squid/whitelist.txt
ここで、IPアドレスを利用するため設定を一部修正します。
# vi /etc/squid/squid.conf
(修正前)acl whitelist dstdomain "/etc/squid/whitelist.txt"
(修正後)acl whitelist dst "/etc/squid/whitelist.txt"
# systemctl reload squid.service
# aws s3 ls baketname
2024-08-24 00:06:32 5319 hogefile
確かに接続できました。
ip-range.jsonから取得するサービスをEC2に変更してホワイトリストに登録した上て、S3をリストしても接続はできません。
API Gatewayに接続する時の注意
上記流れでAPI Gatewayに接続する用にIPアドレスを登録してみます。
jq -r '.prefixes[] | select(.region=="ap-northeast-1") | select(.service=="API_GATEWAY") | .ip_prefix' < ip-ranges.json > /etc/squid/whitelist.txt
実はこの設定では、接続ができません。
API Gatewayの場合は、サービス名指定で出力されるCIDRはAWSから通信される接続元IPアドレスのみを示すためです。
API Gatewayに接続したい場合は、サービスAPI_GATEWAYのCIDRは接続先IP範囲として利用できないため、サービスAMAZONを利用する必要があります。
(AMZONは複数のサービスがまとまっており広い範囲を許可することになります)
API_GATEWAY にリストされているアドレスは送信専用です。すべての IP アドレス範囲を取得する場合は、AMAZON を指定します (つまり、すべてのサブセットも AMAZON サブセットに含まれます)。ただし、一部の IP アドレス範囲は AMAZON サブセット内にしかありません (つまり、別のサブセットでは使用できません)。
# jq -r '.prefixes[] | select(.region=="ap-northeast-1") | select(.service=="AMAZON") | .ip_prefix' < ip-ranges.json > /etc/squid/whitelist.txt
これで技術的には接続できるようになりました。
果たして、ホワイトリストとして求めている制限ができているのかは、定められたポリシーをもとに検討ください。
さいごに
今回はホワイトリスト登録を行う際、AWS IPアドレス範囲について、確かに公開されているCIDRを登録すると接続できることが確認できました。CIDRを登録する場合は、メリット・デメリットを十分に検討ください。
なお、今回プロキシとして「squid」を利用しました。本記事で紹介している設定は検証用ですので、運用される場合は、設定内容は個別に検討ください。
本記事が、参考となれば幸いです。